<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>
// 递归函数
    // 一个函数直接或间接调用自己，该函数称为递归函数
    // 递归的本质其实是函数循环调用

// function fn1(){// 递归函数
//     console.log( 'fn1执行。。。' );
//     fn1();
// }
// fn1();

// 递归有三个主要阶段：1.递归前进段，2.递归出口（终止条件），3.递归返回段

// 什么时候需要用到递归函数？
// 老王有四个子女，老四比老三小2岁，老三比老二小2岁，老二比老大小2岁，老大现在16岁，问老四几岁？

// 解：
// 设 f(x) 可以求出老x的年龄
// f(4) = f(3) - 2
// f(3) = f(2) - 2
// f(2) = f(1) - 2
// f(1) = 16

// f(x) = f(x-1) - 2
// 当 x = 1 时，返回 16 递归的出口条件

function f(x){
    // 递归的出口条件
    if (x == 1) {
        return 16;
    }
    return f(x-1) - 2;
}
// console.log( f(4) );// 10


/** 前端面试题
*@desc: fibonacci  斐波那契数列
*@param: count {Number}
*@return: result {Number} 第count个fibonacci值，计数从1开始
  fibonacci数列为：[1, 1, 2, 3, 5, 8, 13, 21, 34 …]
  getNthFibonacci(3) 返回值为2
  getNthFibonacci(6) 返回值为8
*/

// 解：设 f(n) 可以求出第n个斐波那契数列的值
// f(6) = f(5)+f(4)
// f(5) = f(4)+f(3)
// f(4) = f(3)+f(2)
// f(3) = f(2)+f(1)
// f(2) = 1
// f(1) = 1

// f(n) = f(n-1)+f(n-2)
// 当 n <= 2 时，返回 1 出口条件

function getNthFibonacci(count){
    // 出口条件
    if (count <= 2) {
        return 1;
    }
    return getNthFibonacci(count-1)+getNthFibonacci(count-2);
}

console.log( getNthFibonacci(5) );// 5
console.log( getNthFibonacci(8) );// 21
console.log( getNthFibonacci(10) );// 55

</script>
</body>
</html>